home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / seyon / SeMisc.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  7KB  |  364 lines

  1.  
  2. /*
  3.  * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M.
  4.  * Saggaf. All rights reserved.
  5.  *
  6.  * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full
  7.  * statement of rights and permissions for this program.
  8.  */
  9.  
  10. #include <X11/Intrinsic.h>
  11. #include <X11/StringDefs.h>
  12. #include <X11/Xaw/Dialog.h>
  13.  
  14. #include <signal.h>
  15. #include <sys/types.h>
  16. #include <sys/wait.h>
  17.  
  18. #include "seyon.h"
  19. #include "SeDecl.h"
  20. #include "SeSig.h"
  21.  
  22. extern int      scriptToMainPipe[];
  23. extern pid_t    readProcPid;
  24.  
  25. void
  26.                 SendBreak(),
  27.                 terminal_refresh(),
  28.                 LocalShell(),
  29.                 ToggleCapture(),
  30.                 kill_handler(),
  31.                 DivertFile(),
  32.                 DoDivertFile(),
  33.                 ExecDivertFile(),
  34.                 RunScript(),
  35.                 DoRunScript(),
  36.                 ExecScript();
  37.  
  38. char            captureFile[REG_BUF];
  39. Boolean         capture = False;
  40. FILE           *cfp;
  41.  
  42. void
  43. TopMisc(widget)
  44.      Widget          widget;
  45. {
  46.   void            DialogDisplayFile(),
  47.                   DialogEditFile(),
  48.                   DialogRunScript();
  49.  
  50.   Widget          popup,
  51.                   mBox,
  52.                   uBox,
  53.                   lBox,
  54.                   toggle;
  55.  
  56.   ErrorIfBusy();
  57.  
  58.   XtVaSetValues(widget, XtNsensitive, False, NULL);
  59.   popup = AddSimplePopup("misc", widget);
  60.   XtAddCallback(popup, XtNdestroyCallback, SetSensitiveOn, widget);
  61.  
  62.   mBox = SeAddPaned("mBox", popup);
  63.   uBox = SeAddBox("uBox", mBox);
  64.   lBox = SeAddBox("lBox", mBox);
  65.  
  66.   SeAddButton("break", uBox, SendBreak);
  67.   SeAddButton("refresh", uBox, terminal_refresh);
  68.   SeAddButton("suspend", uBox, LocalShell);
  69.   toggle = SeAddToggle("capture", uBox, ToggleCapture);
  70.   SeAddButton("divert", uBox, DivertFile);
  71.   AddButton("script", uBox, DialogRunScript, NULL);
  72.   AddButton("editFile", uBox, DialogEditFile, NULL);
  73.   AddButton("displayFile", uBox, DialogDisplayFile, NULL);
  74.  
  75.   AddButton("dismiss", lBox, DestroyShell, NULL);
  76.  
  77.   SeSetUnsetToggle(toggle, capture);
  78.  
  79.   PositionShell(popup, widget, SHELLPOS_HWFH);
  80.   XtPopup(popup, XtGrabNone);
  81. }
  82.  
  83. void
  84. SendBreak(widget)
  85.      Widget          widget;
  86. {
  87.   ErrorIfBusy();
  88.   send_break();
  89.   SeyonMessage("BREAK Sent to Remote Host");
  90. }
  91.  
  92. void
  93. terminal_refresh(widget)
  94.      Widget          widget;
  95. {
  96.   ErrorIfBusy();
  97.   RestartTerminal();
  98.   SeyonMessage("Terminal Process Refreshed");
  99. }
  100.  
  101. void
  102. LocalShell(widget)
  103.      Widget          widget;
  104. {
  105.   ErrorIfBusy();
  106.   ShellCommand("");
  107.   SeyonMessage("Terminal Suspended");
  108. }
  109.  
  110. void
  111. ToggleCapture(widget)
  112.      Widget          widget;
  113. {
  114.   ErrorIfBusy();
  115.   DoToggleCapture();
  116.  
  117.   SeSetUnsetToggle(widget, capture);
  118.   RestartTerminal();
  119. }
  120.  
  121. Boolean
  122. DoToggleCapture()
  123. {
  124.   if (capture) {
  125.     fclose(cfp);
  126.     capture = False;
  127.     SeyonMessage("Capture Turned OFF");
  128.   }
  129.   else {
  130.     if ((cfp = fopen(captureFile, "a")) == NULL) {
  131.       SeyonMessagef("Unable to Open Capture File `%s'", captureFile, "", "");
  132.       return False;
  133.     }
  134.     else {
  135.       capture = True;
  136.       SeyonMessage("Capture Turned ON");
  137.     }
  138.   }
  139.   return True;
  140. }
  141.  
  142. /*
  143.  * DivertFile: uploads a text file.
  144.  */
  145.  
  146. void
  147. DivertFile(widget)
  148.      Widget          widget;
  149. {
  150.   ErrorIfBusy();
  151.   SePopupDialogGetStringE("divert_name", widget, DoDivertFile, NULL,
  152.               NULL, True);
  153. }
  154.  
  155. void
  156. divert_action_ok(widget)
  157.      Widget          widget;
  158. {
  159.   DoDivertFile(widget);
  160. }
  161.  
  162. void
  163. DoDivertFile(widget)
  164.      Widget          widget;
  165. {
  166.   Widget          dialog = XtParent(widget);
  167.   String          file_name;
  168.  
  169.   file_name = XawDialogGetValueString(dialog);
  170.   DestroyShell(dialog);
  171.  
  172.   ExecDivertFile(XtParent(GetShell(widget)), file_name);
  173. }
  174.  
  175. void
  176. divert_handler(
  177. #if NeedFunctionPrototypes
  178.         int signo,
  179.         XtPointer client_data
  180. #endif
  181. )
  182. {
  183. #if defined(SUNOS_3) || defined(Mips)
  184.   union wait status;
  185. #else
  186.   int             status;
  187. #endif
  188.  
  189.   if (wait(&status) < 0)
  190.     {SePError("Divert wait failed"); return;}
  191.   XoAppIgnoreSignal(app_con, SIGCHLD);
  192.  
  193. #if defined(SUNOS_3) || defined(Mips)
  194.   switch (status.w_retcode) {
  195. #else
  196.   switch (WEXITSTATUS(status)) {
  197. #endif
  198.   case 0:
  199.     SeyonMessage("Text Upload Successful");
  200.     break;
  201.   case 10:
  202.     SeyonMessage("Text Upload Canceled");
  203.     break;
  204.   }
  205.  
  206.   inhibit_child = False;
  207.   PostProcessPrep();
  208. }
  209.  
  210. void
  211. killdivert_handler(
  212. #if NeedFunctionPrototypes
  213.             int signo
  214. #endif
  215. )
  216. {
  217.   signal(SIGTERM, SIG_IGN);
  218.  
  219.   if (readProcPid && kill(readProcPid, SIGTERM) == 0)
  220.     while(wait((int*)0) < 0);
  221.   exit(10);
  222. }
  223.  
  224. void
  225. ExecDivertFile(widget, file_name)
  226.      Widget          widget;
  227.      String          file_name;
  228. {
  229.   char            fullname[REG_BUF];
  230.   FILE           *fp;
  231.   int             c;
  232.  
  233.   expand_fname(file_name, fullname);
  234.   if ((fp = fopen(fullname, "r")) == NULL) {
  235.     SeyonMessagef("Unable to Open File `%s'", file_name, "", "");
  236.     PopupError("errFileAccess", widget);
  237.     return;
  238.   }
  239.  
  240.   inhibit_child = True;
  241.   SeyonMessagef("Uploading Text File '%s'...", file_name, "", "");
  242.  
  243.   PreProcessPrep();
  244.   XoAppAddSignal(app_con, SIGCHLD, divert_handler, NULL);
  245.  
  246.   if ((w_child_pid = SeFork()) == 0) {
  247.     signal(SIGTERM, killdivert_handler);
  248.  
  249.     if ((readProcPid = SeFork()) == 0)
  250.       PortToTty();
  251.  
  252.     while ((c = getc(fp)) != EOF) {
  253.       send_tbyte(c);
  254.       if (c == '\r' || c == '\n') usleep(MDELAY);
  255.     }
  256.     fclose(fp);
  257.     if (readProcPid && kill(readProcPid, SIGTERM) == 0)
  258.       while(wait((int*)0) < 0);
  259.     exit(0);
  260.   }
  261. }
  262.  
  263. /*
  264.  * run a script
  265.  */
  266.  
  267. void
  268. ScriptHandler(
  269. #if NeedFunctionPrototypes
  270.         int signo,
  271.         XtPointer client_data
  272. #endif
  273. )
  274. {
  275.   int   TerminalRefreshParameters();
  276.  
  277. #if defined(SUNOS_3) || defined(Mips)
  278.   union wait status;
  279. #else
  280.   int             status;
  281. #endif
  282.  
  283.   if (wait(&status) < 0)
  284.     {SePError("Script wait failed"); return;}
  285.   XoAppRemoveSignal(XtWidgetToApplicationContext(topLevel), SIGCHLD);
  286.  
  287. #if defined(SUNOS_3) || defined(Mips)
  288.   switch (status.w_retcode) {
  289. #else
  290.   switch (WEXITSTATUS(status)) {
  291. #endif
  292.   case 0:
  293.     SeyonMessage("Script Completed");
  294.     break;
  295.   case 1:
  296.     SeyonMessage("Script Execution Failed");
  297.     break;
  298.   case 10:
  299.     SeyonMessage("Script Canceled by User");
  300.     get_modem_attr();
  301.     break;
  302.   }
  303.  
  304.   inhibit_child = False;
  305.   PostProcessPrep(); 
  306.   TerminalRefreshParameters(); 
  307. }
  308.  
  309. void
  310. KillScriptHandler(
  311. #if NeedFunctionPrototypes
  312.             int signo
  313. #endif
  314. )
  315. {
  316.   int    PutParameters();
  317.  
  318.   signal(SIGTERM, SIG_IGN);
  319.   PutParameters(scriptToMainPipe);
  320.   exit(10);
  321. }
  322.  
  323. void
  324. RunScript(parent, scriptName)
  325.      Widget          parent;    /* Not used. Can be NULL */
  326.      String          scriptName;
  327. {
  328.   int    PutParameters();
  329.   int    scriptRet;
  330.  
  331.   ErrorIfBusy();
  332.  
  333.   inhibit_child = True;
  334.   SeyonMessage(FmtString("Running Script ``%s''...", scriptName, "", ""));
  335.  
  336.   PreProcessPrep();
  337.   XoAppAddSignal(XtWidgetToApplicationContext(topLevel), SIGCHLD, 
  338.                  ScriptHandler, NULL);
  339.  
  340.   if ((w_child_pid = SeFork()) == 0) {
  341.     signal(SIGTERM, KillScriptHandler);
  342.  
  343.     scriptRet = (int)do_script(scriptName);
  344.     PutParameters(scriptToMainPipe);
  345.     exit(scriptRet ? 0 : 1);
  346.   }
  347. }
  348.  
  349. void
  350. DialogRunScript(widget)
  351.      Widget          widget;
  352. {
  353.   void GetValueByPopup();
  354.  
  355.   ErrorIfBusy();
  356.   linkflag = 0;
  357.   GetValueByPopup(widget, "dialogScriptName", RunScript);
  358. }
  359.  
  360. void ExecExit()
  361. {
  362.   s_exit();
  363. }
  364.